package controller.xml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.crypto.KeySelector.Purpose;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;

import sim_moteur.Simulateur;
import sim_moteur.Terrain;
import sim_moteur.element.animeaux.Animal;
import util.SimProperties;
import vue.Affichable;
import controleur.Controleur;
import controleur.SimulationControllerThread;

public class ControllerXML {
	private static final String SIMULATION_ENTREE_XML_AUTOMATIQUE = "simulation.entree.XML.automatique";

	private static final String ABSOLUTE_PATH = "./output/";
	private Controleur controleur;
	private String outputPath = null;
	private String nomScenario = null;

	public ControllerXML(Controleur controleur) {

		this.controleur = controleur;

	}

	public void setOutputPath(String pOutput) {
		this.outputPath = pOutput;
	}

	public String getOutputPath() {
		return this.outputPath;
	}

	/**
	 * Initialise le controller de fichiers XML
	 * 
	 * @param nom
	 *            le nom du nouveau scénario
	 * @param nombreSim
	 *            le nombre de simulateurs impliqués
	 */
	public void init(String nom, int nombreSim) {
		this.nomScenario = nom;
		String tempPath = "./output/" + nom;
		this.setOutputPath(tempPath);
		deleteFolder(new File(tempPath));
		new File(tempPath).mkdirs();
	}

	public void writeXML(int noStep,
			SimulationControllerThread simControllerList)
			throws XMLStreamException, FileNotFoundException {
		// TODO Auto-generated method stub
		FileOutputStream output = new FileOutputStream(getOutputPath()
				+ "/step" + noStep + ".xml");
		XMLOutputFactory fabrique = XMLOutputFactory.newInstance();
		XMLStreamWriter writer = fabrique.createXMLStreamWriter(output);
		writer.writeStartDocument();
		writer.writeStartElement("simulateur");
		writer.writeAttribute("xmlns:xsi",
				"http://www.w3.org/2001/XMLSchema-instance");
		writer.writeAttribute("xsi:schemaLocation",
				"http://www.example.org/cegep cegep.xsd ");
		writer.writeAttribute("numeroPasTemps", Integer.toString(noStep));
		writer.writeAttribute("nomScenario", nomScenario);
		writer.writeAttribute("dimensionTerrainX",
				Integer.toString(Terrain.getInstance().getXSize()));
		writer.writeAttribute("dimensionTerrainY",
				Integer.toString(Terrain.getInstance().getYSize()));
		writer.writeStartElement("element");
		for (Affichable animaux : simControllerList.getAnimaux()) {
			writer.writeStartElement(animaux.getName());
			writer.writeAttribute("coordX",
					Integer.toString(animaux.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(animaux.getCoordonnees().getY()));
			writer.writeAttribute("vie", Float.toString(animaux.getVie()));
			writer.writeEndElement();
		}
		for (Affichable animaux : simControllerList.getVegetaux()) {
			writer.writeStartElement(animaux.getName());
			writer.writeAttribute("coordX",
					Integer.toString(animaux.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(animaux.getCoordonnees().getY()));
			writer.writeAttribute("vie", Float.toString(animaux.getVie()));
			writer.writeEndElement();
		}
		for (Affichable animaux : simControllerList.getLesChosesBasiques()) {
			writer.writeStartElement(animaux.getName());
			writer.writeAttribute("coordX",
					Integer.toString(animaux.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(animaux.getCoordonnees().getY()));
			writer.writeEndElement();
		}
		writer.writeEndElement();
		writer.writeEndElement();
		writer.writeEndDocument();
		writer.flush();
		writer.close();

	}

	/**
	 * détruit tous les dossiers de façon récurrente
	 * 
	 * @param folder
	 *            le dossier à détruire
	 */
	public static void deleteFolder(File folder) {
		File[] fichiers = folder.listFiles();
		if (fichiers != null) { // some JVMs return null for empty dirs
			for (File fichier : fichiers) {
				if (fichier.isDirectory()) {
					deleteFolder(fichier);
				} else {
					fichier.delete();
				}
			}
		}
		folder.delete();
	}

}
